gusucode.com > LTE基带收发仿真系统matlab源码程序 > LTE baseband simulation/de_modulate.m
function demode_data = de_modulate(receive_signal,Qm) % 函数实现功能:对接收到的信号进行调制,解调的方式由Qm决定 % Qm为2进行QPSK解调,Qm为4进行16QAM解调,Qm为6进行64QAM解调 % 输入: % receive_signal:调制输入信号 % Qm:调制方式对应的比特数 % 输出: % demode_data:存储解调后的结果 % % Author: 程式小组(徐萌 张妙 张晓庆) % Date: 2010-07-11 % =========================================================== Isymbols = real(receive_signal); Qsymbols = imag(receive_signal); switch Qm case 2 demode_data = QPSKdemode(Isymbols, Qsymbols); % 进行QPSK解调 case 4 demode_data = QAM16demode(Isymbols, Qsymbols); % 进行16QAM解调 case 6 demode_data = QAM64demode(Isymbols, Qsymbols); % 进行64QAM解调 end end function output_data = QPSKdemode(Isymbols, Qsymbols) % QPSK的软解调 % LLR采用欧式距离计算 % 输入QPSK符号的正交分量和同向分量 % 解调后的输出放在output_data中 len = length(Isymbols); output_data = zeros(1,2*len); for n = 1:len b0 = Isymbols(n); b1 = Qsymbols(n); output_data([2*(n-1)+1 2*n]) = [-b0,-b1]; end % len = length(Isymbols); % b1 = zeros(1,len); % b0 = zeros(1,len); % for n=1:len % % 接收信号到所有可能发射点的距离 % Distance0 = (Isymbols(n)-(sqrt(2)/2))*(Isymbols(n)-(sqrt(2)/2)) + (Qsymbols(n)-(sqrt(2)/2))*(Qsymbols(n)-(sqrt(2)/2)); %pi/4 % Distance2 = (Isymbols(n)+(sqrt(2)/2))*(Isymbols(n)+(sqrt(2)/2)) + (Qsymbols(n)-(sqrt(2)/2))*(Qsymbols(n)-(sqrt(2)/2)); %3pi/4 % Distance3 = (Isymbols(n)+(sqrt(2)/2))*(Isymbols(n)+(sqrt(2)/2)) + (Qsymbols(n)+(sqrt(2)/2))*(Qsymbols(n)+(sqrt(2)/2)); %5pi/4 % Distance1 = (Isymbols(n)-(sqrt(2)/2))*(Isymbols(n)-(sqrt(2)/2)) + (Qsymbols(n)+(sqrt(2)/2))*(Qsymbols(n)+(sqrt(2)/2)); %7pi/4 % % I支路 % X=[Distance0,Distance1]; % 发射信号为0的集合 % min_num = min(X); % 求出发射信号为0的集合中的最小值 % Y=[Distance2,Distance3]; % 发射信号为1的集合 % min_denum = min(Y); % 求出发射信号为1的集合中的最小值 % b1(n) = min_num - min_denum; % I支路的LLR % % Q支路 % X=[Distance0,Distance2]; % 发射信号为0的集合 % min_num = min(X); % 求出发射信号为0的集合中的最小值 % Y=[Distance1,Distance3]; % 发射信号为1的集合 % min_denum = min(Y); % 求出发射信号为1的集合中的最小值 % b0(n)= min_num - min_denum; % Q支路的LLR % end % % 并串变化 % output_data(1:2:length(Isymbols)*2) = b1; % output_data(2:2:length(Isymbols)*2) = b0; end function output_data = QAM16demode(Isymbols, Qsymbols) % 16QAM的软解调 % LLR采用边界法计算 % 输入16QAM符号的正交分量和同向分量 % 解调后的输出放在output_data中 d = 1/sqrt(10); Identify = [0 1]; % 定义示性函数 len = length(Isymbols); % I支路 LLR_I = zeros(1,2); LLR_Q = zeros(1,2); for n = 1:len Distance_I1 = Isymbols(n); Distance_I2 = abs(Distance_I1)-2*d; Distance = [Distance_I1 Distance_I2]; for k = 1:2 if Identify(k)==1 LLR_I(k) = Distance(k); else LLR_I(k) = -Distance(k); end end % Q支路 Distance_Q1 = Qsymbols(n); Distance_Q2 = abs(Distance_Q1)-2*d; Distance = [Distance_Q1 Distance_Q2]; for k = 1:2 if Identify(k)==1 LLR_Q(k) = Distance(k); else LLR_Q(k) = -Distance(k); end end output_data((n-1)*4+1:n*4) = [LLR_I(1) LLR_Q(1) LLR_I(2) LLR_Q(2)]; end end function output_data = QAM64demode(Isymbols, Qsymbols) % 16QAM的软解调 % LLR采用边界法计算 % 输入16QAM符号的正交分量和同向分量 % 解调后的输出放在output_data中 d = 1/sqrt(42); %Reliability = [1 2 3]; % 定义编码比特b_I的可靠性级别 Identify = [0 1 1]; % 定义示性函数 len = length(Isymbols); LLR_I = zeros(1,3); LLR_Q = zeros(1,3); % I支路 for n = 1:len Distance_I1 = Isymbols(n); Distance_I2 = abs(Distance_I1)-4*d; Distance_I3 = abs(abs(Distance_I1)-4*d)-2*d; Distance = [Distance_I1 Distance_I2 Distance_I3]; for k = 1:3 if Identify(k)==1 LLR_I(k) = Distance(k); else LLR_I(k) = -Distance(k); end end % Q支路 Distance_Q1 = Qsymbols(n); Distance_Q2 = abs(Distance_Q1)-4*d; Distance_Q3 = abs(abs(Distance_Q1)-4*d)-2*d; Distance = [Distance_Q1 Distance_Q2 Distance_Q3]; for k = 1:3 if Identify(k)==1 LLR_Q(k) = Distance(k); else LLR_Q(k) = -Distance(k); end end output_data((n-1)*6+1:n*6) = [LLR_I(1) LLR_Q(1) LLR_I(2) LLR_Q(2) LLR_I(3) LLR_Q(3)]; end end